\documentclass[12pt, a4paper]{article}
\usepackage{geometry}
\usepackage{tikz}
\geometry{
	a4paper,
	left=12.7 mm,
	right=12.7 mm,
	top=12.7 mm,
	bottom=12.7 mm,
}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{physics}
\graphicspath{ {./} }
\usepackage{ctex}

\newcommand{\bvec}[1]{\ensuremath{\mathbf{#1}}}
\newcommand{\formula}[1]{\text{式} \ref{#1} }
\begin{document}
	
	\section{扩散方程的有限体积法}
	\footnote{参考：https://www.bilibili.com/opus/925757037927727105 \textsl{这年头哔站都能做学术了！}}
	之前我们主要讨论了有限差分格式（FDM），现在我们简要讨论有限体积格式（FVM）。
	尽管在网格划分、迭代格式上，FDM和FVM如出一辙，但是二者略有区别：
	FDM主要专注于数学上对微分形式的离散化（Taylor展开取低阶项），而FVM额外考虑了PDE要求的守恒律等。
	因此，对于某些性质特殊的PDE，FVM能更好地迭代求解PDE。
	我们仍然以我们的老朋友，扩散方程，为例，简要讨论FVM。
	扩散方程具有如下形式：
	\begin{equation}
		u = u(x, t) \qquad \pdv{u}{t} = D \pdv[2]{u}{x}
	\end{equation}
	\textsl{数值计算以花式求解扩散方程为本！}
	
	\subsection*{FDM 格式}
	众所周知，扩散方程的FDM格式是
	\begin{equation}
		u^{(k+1)}_{i} = u^{(k)}_{i} + \frac{D \Delta t}{(\Delta x)^2} [u^{(k)}_{i+1}  - 2u^{(k)}_{i}  +u^{(k)}_{i-1} ]
	\end{equation}
	
	\subsection*{FVM 格式}
	要讨论扩散方程的FVM格式，我们最好回顾扩散方程的“原始版本”：
	\begin{equation}
		\begin{cases}
			\pdv{u}{t} &= - \pdv{j}{x} \\
			j &= - D \pdv{u}{x}
		\end{cases}
	\end{equation}
	其中$j$相当于边界的流量。第一个方程是我们熟悉的局域守恒方程，而第二个是半经验的流量与密度差的Ficker定律，
	因此扩散方程暗中包含一个守恒律
	\footnote
	{
		写出扩散方程的“正统”形式，我们更好理解其背后的含义：	
		$$
			\begin{cases}
				\pdv{u}{t} &= - \div \bvec j \\
				\bvec j &= - D \grad u
			\end{cases}
		$$
		两侧同时对一定空间体积积分，并运用散度定理：
		$$
		\int \pdv{u}{t} \dd V = - \int \div \bvec j \dd V = \oint \bvec j \cdot \bvec n \dd A
		$$
		亦即
		$$
		\dv{Q}{t} = -\oint \bvec j \cdot \bvec n \dd A
		$$
		即一定区间内$Q = \int u \dd V$的减少，等于流出这个区域的流量。
	}
	。
	FVM需要分别离散化这两个方程。和Lax-Wendroff法类似，我们将$j$的离散点放在半整数格子处:
	\begin{equation}
		\begin{aligned}
			j^{(k)}_{i+1/2} &= - D \frac{u^{(k)}_{i+1} - u^{(k)}_{i}}{\Delta x} \\
			j^{(k)}_{i-1/2} &= - D \frac{u^{(k)}_{i} - u^{(k)}_{i-1}}{\Delta x}
		\end{aligned}
	\end{equation}
	边界上的$j_{n+1/2}, j_{-1/2}$将由边界条件确定。
	那么，$\pdv{u}{t}$的离散化是
	\begin{equation}
		u^{(k+1)}_{i} = u^{(k)}_{i} - \frac{\Delta t}{\Delta x} [j^{(k)}_{i+1/2}-j^{(k)}_{i-1/2} ]
	\end{equation}
	这使得$u_i$相当于$(i - 1/2, i+1/2)$这一小区间内某物理量的含量，更准确地说，密度。
	结合二者，我们得到扩散方程的FVM形式：
	\begin{equation}
		\begin{cases}
			u^{(k+1)}_{i} &= u^{(k)}_{i} - \frac{\Delta t}{\Delta x} \left[ j^{(k)}_{i+1/2} - j^{(k)}_{i-1/2} \right], \\
			j^{(k)}_{i+1/2} &= -D \frac{u^{(k)}_{i+1} - u^{(k)}_{i}}{\Delta x}, \\
			j^{(k)}_{i-1/2} &= -D \frac{u^{(k)}_{i} - u^{(k)}_{i-1}}{\Delta x}.
		\end{cases}
	\end{equation}
	可见，$j_{i \pm 1/2}$也是中间变量。
	
	那么，为什么说FVM更好地体现了守恒律呢？
	我们简要证明，假定$Q$是全区域内的某一物理量，而$u$是各个小区域内这一物理量的密度，那么：
	\begin{equation}
		\begin{aligned}
			Q^{(k+1)} &= \sum_i u_i^{(k+1)} \Delta x \\
			&= \sum_i \left[ u_i^{(k)} - \frac{\Delta t}{\Delta x} \left( j^{(k)}_{i+1/2} - j^{(k)}_{i-1/2} \right) \right] \Delta x \\
			&= \Delta x \left( u^{(k)}_0 + u^{(k)}_1 + u^{(k)}_2 + \dots - \frac{\Delta t}{\Delta x} \left( j^{(k)}_{1/2} - j^{(k)}_{-1/2} + j^{(k)}_{3/2} - j^{(k)}_{1/2} + \dots \right) \right) \\
			&= Q^{(k)} - \Delta t \left( j_{n+1/2} - j_{-1/2} \right)
		\end{aligned}
	\end{equation}
	$j_{n+1/2}, j_{-1/2}$将由边界条件确定，若采用第二类边界，那么二者均为$0$，这将使$Q^{(k+1)} = Q^{(k)}$。
	因此，FVM格式从数学上保证了$Q$的守恒（但较真地说，这仍然不意味着$Q$守恒绝对精确成立，因为浮点数加法仍存在“大数加小数”或机器精度舍入误差而造成的精度问题）。
	
	有小伙伴可能会质疑，如果完全展开FVM的迭代格式并消去$j$，会发现其和FDM的格式一致？
	这是因为，这是一个简单的扩散问题，二者效果相同。
	然而，在非均匀扩散等复杂情况下（各处$D$不同），FDM和FVM的格式将不再相同。
	此时，FDM将无法保证$Q$的守恒（对右侧的Taylor展开损失了高阶项，应该是在$(\Delta x)^3$的量级），而FVM仍将保持$Q$的守恒（几乎在机器精度的量级）。
	% 不要小看$Q$误差的积累：很可能导致迭代在足够多步之后“爆炸”式发散！
	
	一个二维FVM扩散方程的实现参考隔壁仓库。

\end{document}
